Package de.yaams.extensions.basemap.tiled.mapeditor.dialogs

Source Code of de.yaams.extensions.basemap.tiled.mapeditor.dialogs.TilesetManager

/*
* Tiled Map Editor, (c) 2004-2006
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* Adam Turk <aturk@biggeruniverse.com> Bjorn Lindeijer <bjorn@lindeijer.nl>
* Rainer Deyke <rainerd@eldwood.com>
*/

package de.yaams.extensions.basemap.tiled.mapeditor.dialogs;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import de.yaams.extensions.basemap.tiled.core.LayerLockedException;
import de.yaams.extensions.basemap.tiled.core.Map;
import de.yaams.extensions.basemap.tiled.core.MapLayer;
import de.yaams.extensions.basemap.tiled.core.Tile;
import de.yaams.extensions.basemap.tiled.core.TileLayer;
import de.yaams.extensions.basemap.tiled.core.TileSet;
import de.yaams.extensions.basemap.tiled.io.MapHelper;
import de.yaams.extensions.basemap.tiled.mapeditor.Resources;
import de.yaams.extensions.basemap.tiled.mapeditor.util.ConfirmingFileChooser;
import de.yaams.extensions.basemap.tiled.mapeditor.util.TilesetTableModel;

/**
* The tileset manager manages the tilesets of the loaded map.
*/
public class TilesetManager extends JDialog implements ActionListener, ListSelectionListener {
  /**
   *
   */
  private static final long serialVersionUID = -4179293324736811079L;

  private final Map map;

  private JButton saveButton, saveAsButton, embedButton, removeButton, editButton;
  private JButton moveUpButton, moveDownButton, closeButton;
  private TilesetTableModel tilesetTableModel;
  private JTable tilesetTable;

  private static final String DIALOG_TITLE = Resources.getString("dialog.tilesetmanager.title");
  private static final String CLOSE_BUTTON = Resources.getString("general.button.close");
  private static final String MOVE_UP_BUTTON = Resources.getString("dialog.tilesetmanager.button.moveup");
  private static final String MOVE_DOWN_BUTTON = Resources.getString("dialog.tilesetmanager.button.movedown");
  private static final String REMOVE_BUTTON = Resources.getString("general.button.remove");
  private static final String EMBED_BUTTON = Resources.getString("dialog.tilesetmanager.embed.button");
  private static final String SAVE_AS_BUTTON = Resources.getString("action.map.saveas.name");
  private static final String EDIT_BUTTON = Resources.getString("dialog.tilesetmanager.edit.button");
  private static final String SAVE_BUTTON = Resources.getString("action.map.save.name");

  private static final Icon REMOVE_BUTTON_ICON = Resources.getIcon("gnome-delete.png");
  private static final Icon EMBED_BUTTON_ICON = Resources.getIcon("insert-object.png");
  private static final Icon SAVE_AS_BUTTON_ICON = Resources.getIcon("document-save-as.png");
  private static final Icon EDIT_BUTTON_ICON = Resources.getIcon("gtk-edit.png");
  private static final Icon SAVE_BUTTON_ICON = Resources.getIcon("document-save.png");

  public TilesetManager(JFrame parent, Map map) {
    super(parent, DIALOG_TITLE, true);
    this.map = map;
    init();
    pack();
    setLocationRelativeTo(getOwner());
  }

  private void init() {
    // Create the tileset table
    tilesetTableModel = new TilesetTableModel(map);
    tilesetTable = new JTable(tilesetTableModel);
    tilesetTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tilesetTable.getSelectionModel().addListSelectionListener(this);
    JScrollPane tilesetScrollPane = new JScrollPane(tilesetTable);
    tilesetScrollPane.setPreferredSize(new Dimension(360, 150));

    // Create the buttons
    saveButton = new JButton(SAVE_BUTTON_ICON);
    editButton = new JButton(EDIT_BUTTON_ICON);
    saveAsButton = new JButton(SAVE_AS_BUTTON_ICON);
    embedButton = new JButton(EMBED_BUTTON_ICON);
    removeButton = new JButton(REMOVE_BUTTON_ICON);
    moveUpButton = new JButton(MOVE_UP_BUTTON);
    moveDownButton = new JButton(MOVE_DOWN_BUTTON);
    closeButton = new JButton(CLOSE_BUTTON);

    saveButton.setActionCommand(SAVE_BUTTON);
    saveAsButton.setActionCommand(SAVE_AS_BUTTON);
    embedButton.setActionCommand(EMBED_BUTTON);
    removeButton.setActionCommand(REMOVE_BUTTON);
    editButton.setActionCommand(EDIT_BUTTON);

    saveButton.setMargin(new Insets(0, 0, 0, 0));
    saveAsButton.setMargin(new Insets(0, 0, 0, 0));
    embedButton.setMargin(new Insets(0, 0, 0, 0));
    removeButton.setMargin(new Insets(0, 0, 0, 0));
    editButton.setMargin(new Insets(0, 0, 0, 0));

    saveButton.setToolTipText(SAVE_BUTTON);
    saveAsButton.setToolTipText(SAVE_AS_BUTTON);
    embedButton.setToolTipText(EMBED_BUTTON);
    removeButton.setToolTipText(REMOVE_BUTTON);
    editButton.setToolTipText(EDIT_BUTTON);

    saveButton.addActionListener(this);
    saveAsButton.addActionListener(this);
    embedButton.addActionListener(this);
    removeButton.addActionListener(this);
    editButton.addActionListener(this);
    moveUpButton.addActionListener(this);
    moveDownButton.addActionListener(this);
    closeButton.addActionListener(this);

    // Create the main panel
    JPanel mainPanel = new JPanel(new BorderLayout(5, 5));
    mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    mainPanel.add(tilesetScrollPane, BorderLayout.CENTER);

    Dimension spacing = new Dimension(5, 5);

    JPanel iconPanel = new JPanel();
    iconPanel.setLayout(new BoxLayout(iconPanel, BoxLayout.PAGE_AXIS));
    iconPanel.add(saveButton);
    iconPanel.add(Box.createRigidArea(spacing));
    iconPanel.add(saveAsButton);
    iconPanel.add(Box.createRigidArea(spacing));
    iconPanel.add(embedButton);
    iconPanel.add(Box.createRigidArea(spacing));
    iconPanel.add(removeButton);
    iconPanel.add(Box.createRigidArea(spacing));
    iconPanel.add(editButton);
    iconPanel.add(Box.createGlue());
    mainPanel.add(iconPanel, BorderLayout.LINE_END);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
    buttonPanel.add(moveUpButton);
    buttonPanel.add(Box.createRigidArea(spacing));
    buttonPanel.add(moveDownButton);
    buttonPanel.add(Box.createRigidArea(spacing));
    buttonPanel.add(Box.createGlue());
    buttonPanel.add(closeButton);
    mainPanel.add(buttonPanel, BorderLayout.PAGE_END);

    getContentPane().add(mainPanel);
    getRootPane().setDefaultButton(closeButton);

    tilesetTable.changeSelection(0, 0, false, false);
  }

  @Override
  public void actionPerformed(ActionEvent event) {
    String command = event.getActionCommand();
    int selectedRow = tilesetTable.getSelectedRow();
    Vector<?> tilesets = map.getTilesets();
    TileSet set = null;
    try {
      set = (TileSet) tilesets.get(selectedRow);
    } catch (IndexOutOfBoundsException e) {
    }

    if (command.equals(CLOSE_BUTTON)) {
      dispose();
    } else if (command.equals(EDIT_BUTTON)) {
      if (map != null && selectedRow >= 0) {
        TileDialog tileDialog = new TileDialog(this, set, map);
        tileDialog.setVisible(true);
      }
    } else if (command.equals(REMOVE_BUTTON)) {
      if (checkSetUsage(set) > 0) {
        int ret = JOptionPane.showConfirmDialog(this, Resources.getString("action.tileset.remove.in-use.message"),
            Resources.getString("action.tileset.remove.in-use.title"), JOptionPane.YES_NO_OPTION);
        if (ret != JOptionPane.YES_OPTION) {
          return;
        }
      }
      try {
        map.removeTileset(set);
        updateTilesetTable();
      } catch (LayerLockedException e) {
        JOptionPane.showMessageDialog(this, Resources.getString("action.tileset.remove.error.layer-locked.message"),
            Resources.getString("action.tileset.remove.error.title"), JOptionPane.ERROR_MESSAGE);
      }
    } else if (command.equals(SAVE_AS_BUTTON)) {
      JFileChooser ch = new ConfirmingFileChooser(map.getFilename());
      MapHelper.addExtension(ch);

      int ret = ch.showSaveDialog(this);
      if (ret == JFileChooser.APPROVE_OPTION) {
        String filename = ch.getSelectedFile().getAbsolutePath();
        try {
          MapHelper.saveTileset(set, filename);
          set.setSource(filename);
          embedButton.setEnabled(true);
          saveButton.setEnabled(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    } else if (command.equals(SAVE_BUTTON)) {
      try {
        MapHelper.saveTileset(set, set.getSource());
      } catch (Exception e) {
        e.printStackTrace();
      }
    } else if (command.equals(EMBED_BUTTON)) {
      set.setSource(null);
      embedButton.setEnabled(false);
      saveButton.setEnabled(false);
    } else if (command.equals(MOVE_UP_BUTTON)) {
      if (selectedRow > 0) {
        int newRow = selectedRow - 1;
        map.swapTileSets(selectedRow, newRow);
        tilesetTable.getSelectionModel().setSelectionInterval(newRow, newRow);
      }
    } else if (command.equals(MOVE_DOWN_BUTTON)) {
      if (selectedRow > -1 && selectedRow < tilesetTable.getRowCount() - 1) {
        int newRow = selectedRow + 1;
        map.swapTileSets(selectedRow, newRow);
        tilesetTable.getSelectionModel().setSelectionInterval(newRow, newRow);
      }
    }
  }

  private void updateTilesetTable() {
    tilesetTable.repaint();
  }

  private int checkSetUsage(TileSet tileset) {
    int used = 0;
    Iterator<?> tileIterator = tileset.iterator();

    while (tileIterator.hasNext()) {
      Tile tile = (Tile) tileIterator.next();
      Iterator<?> layerIterator = map.getLayers();

      while (layerIterator.hasNext()) {
        MapLayer ml = (MapLayer) layerIterator.next();
        if (ml instanceof TileLayer) {
          if (((TileLayer) ml).isUsed(tile)) {
            used++;
            break;
          }
        }
      }
    }

    return used;
  }

  @Override
  public void valueChanged(ListSelectionEvent event) {
    updateButtons();
  }

  private void updateButtons() {
    int selectedRow = tilesetTable.getSelectedRow();

    moveUpButton.setEnabled(selectedRow > 0);

    moveDownButton.setEnabled(selectedRow > -1 && selectedRow < tilesetTable.getRowCount() - 1);

    Vector<?> tilesets = map.getTilesets();
    TileSet set = null;
    try {
      set = (TileSet) tilesets.get(selectedRow);
    } catch (IndexOutOfBoundsException e) {
    }

    editButton.setEnabled(set != null);
    removeButton.setEnabled(set != null);
    saveButton.setEnabled(set != null && set.getSource() != null);
    saveAsButton.setEnabled(set != null);
    embedButton.setEnabled(set != null && set.getSource() != null);
  }

  @Override
  public void setVisible(boolean visible) {
    super.setVisible(visible);
    tilesetTableModel.clearListeners();
  }
}
TOP

Related Classes of de.yaams.extensions.basemap.tiled.mapeditor.dialogs.TilesetManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.